//
//  Algorithm.m
//  2048
//
//  Created by 高新川 on 15/6/7.
//  Copyright (c) 2015年 高新川. All rights reserved.
//

#import "Algorithm.h"
#import "DataModel.h"

@implementation Algorithm

#pragma mark - 滑动规则
- (void)caculateTop:(DataModel *)model {
    [self up_remove_blank:model];
    [self up:model];
}

- (void)caculateBottom:(DataModel *)model {
    [self down_remove_blank:model];
    [self down:model];
}

- (void)caculateLeft:(DataModel *)model {
    [self left_remove_blank:model];
    [self left:model];
}

- (void)caculateRight:(DataModel *)model {
    [self right_remove_blank:model];
    [self right:model];
}

- (int)getAddScore {
    int temp = _addScore;
    _addScore = 0;
    return temp;
}

#pragma mark - 新一个
- (BOOL)randNewOne:(DataModel *)model {
    array data = [model getData];
    int all = 0;
    for (int i=0; i<model.matrix; i++) {
        for (int j=0; j<model.matrix; j++) {
            if (data[i][j] == 0) {
                all = all + 1;
            }
        }
    }
    if (all == 0) {
        return NO;
    }
    int index = arc4random() % all;
    all = 0;
    for (int i=0; i<model.matrix; i++) {
        for (int j=0; j<model.matrix; j++) {
            if (data[i][j] == 0) {
                all = all + 1;
                if (all == index+1) {
                    data[i][j] = 2;
                    return YES;
                }
            }
        }
    }
    return NO;
}

#pragma mark - 滑动算法
- (void)up_remove_blank:(DataModel *)model {
    array data = [model getData];
    int i,j,k;
    for(j=0;j < model.matrix;j++){
        for(i=1;i < model.matrix;i++){
            k=i;
            while(k-1>=0&&data[k-1][j]==0){//上面的那个为空
                //swap(data[k][j],data[k-1][j]);
                int temp = data[k][j];
                data[k][j] = data[k-1][j];
                data[k-1][j] = temp;
                k--;
            }
        }
    }
}

- (void)down_remove_blank:(DataModel *)model {
    array data = [model getData];
    int i,j,k;
    for(j=0; j < model.matrix; j++){
        for(i = model.matrix-2; i >= 0; i--){
            k=i;
            while(k+1<=model.matrix-1&&data[k+1][j]==0){//上面的那个为空
                //swap(a[k][j],a[k][j]);
                int temp = data[k][j];
                data[k][j] = data[k+1][j];
                data[k+1][j] = temp;
                k++;
            }
        }
    }
}

- (void)left_remove_blank:(DataModel *)model {
    array data = [model getData];
    int i,j,k;
    for(i=0;i < model.matrix;i++){
        for(j=1;j<model.matrix;j++){
            k=j;
            while(k-1>=0&&data[i][k-1]==0){//上面的那个为空
                //swap(a[i][k],a[i][k-1]);
                int temp = data[i][k];
                data[i][k] = data[i][k-1];
                data[i][k-1] = temp;
                k--;
            }
        }
    }
}
- (void)right_remove_blank:(DataModel *)model {
    array data = [model getData];
    int i,j,k;
    for(i=0;i<model.matrix;i++){
        for(j=model.matrix-2;j>=0;j--){
            k=j;
            while(k+1<=model.matrix-1&&data[i][k+1]==0){//上面的那个为空
                //swap(a[i][k],a[i][k+1]);
                int temp = data[i][k];
                data[i][k] = data[i][k+1];
                data[i][k+1] = temp;
                k++;
            }
        }
    }
}
- (void)left:(DataModel *)model {
    array data = [model getData];
    int i,j;
    for(i=0;i<model.matrix;i++){
        for(j=0;j<model.matrix-1;j++){
            if(data[i][j]==data[i][j+1]){
                _addScore = _addScore + data[i][j];
                data[i][j]+=data[i][j+1];
                data[i][j+1]=0;
                [self left_remove_blank:model];
            }
        }
    }
}
- (void)right:(DataModel *)model {
    array data = [model getData];
    int i,j;
    for(i=0;i<model.matrix;i++){
        for(j=model.matrix-1;j>=1;j--){
            if(data[i][j]==data[i][j-1]){
                _addScore = _addScore + data[i][j];
                data[i][j]+=data[i][j-1];
                data[i][j-1]=0;
                [self right_remove_blank:model];
            }
        }
    }
}
- (void)up:(DataModel *)model {
    array data = [model getData];
    int i,j;
    for(j=0;j<model.matrix;j++){//每一列
        for(i=0;i<model.matrix-1;i++){
            if(data[i][j]==data[i+1][j]){
                _addScore = _addScore + data[i][j];
                data[i][j]=data[i][j]+data[i+1][j];
                data[i+1][j]=0;
                //移除空格
                [self up_remove_blank:model];
            }
        }
    }
}
- (void)down:(DataModel *)model {
    array data = [model getData];
    int i,j;
    for(j=0;j<model.matrix;j++){//每一列
        for(i=model.matrix-1;i>=1;i--){
            if(data[i][j]==data[i-1][j]){
                _addScore = _addScore + data[i][j];
                data[i][j]=data[i][j]+data[i-1][j];
                data[i-1][j]=0;
                //移除空格
                [self down_remove_blank:model];
            }
        }
    }
}


@end
